#ifndef ModelConfig_H
#define ModelConfig_H 

#include <string>
#include <memory>
#include <vector>
#include <map>
#include <json/json.h>

namespace AVSAnalyzer {

// 算法配置相关结构体
struct AlgorithmClass {
    int id;
    std::string name;
    float scoreThreshold;
};
//本地算法模型配置
struct AlgorithmConfig {
    int gid;                                // 全局模型ID
    std::string name;                       // 算法模型名称
    std::string version;                    // 算法版本
    std::string path;                       // 模型文件名称
    std::string type;                       // 算法类型
    
    float scoreThreshold;                   // 全局置信度阈值
    float nmsThreshold;                     // NMS阈值
    std::vector<std::string> className;     // 类别名称列表
    std::vector<AlgorithmClass> classes;    // 类别详细配置

    struct {
        float recognitionDistanceThresh;
        std::vector<int> inputSize;
        struct {
            std::vector<float> mean;
            std::vector<float> std;
            float scale;
        } preprocess;
    } algorithmParams;

    // 新增后处理参数
    struct PostProcessParams {
        float nms_threshold = 0.5f;     // NMS阈值
        float min_area = 32*32;         // 最小检测区域面积
        bool enable_size_filter = true; // 是否启用尺寸过滤
        // 可添加其他算法特定参数
    } postProcessParams;
};

class ModelConfig {
public:
    static ModelConfig& getInstance() {
        static ModelConfig instance;
        return instance;
    }
    
    // 加载models目录下的所有算法配置
    bool loadAllConfigs();
    
    // 获取算法配置
    const AlgorithmConfig* getAlgorithmConfig(const std::string& name) const;

    // 遍历所有算法配置
    template<typename Callback>
    void forEachConfig(Callback callback) const {
        for (const auto& [name, config] : mAlgorithmConfigs) {
            callback(name, config);
        }
    }

private:
    ModelConfig() = default;
    ~ModelConfig() = default;
    
    // 加载单个算法配置文件
    bool loadAlgorithmConfig(const std::string& configPath);
    bool loadAlgorithmConfig(const std::string& configPath, const std::string& subdirName);
    
    // 解析配置文件
    bool parseAlgorithmConfig(const Json::Value& json, AlgorithmConfig& config);
    bool parseAlgorithmConfig(const Json::Value& json, AlgorithmConfig& config, const std::string& subdirName);
    // 算法配置映射表
    std::map<std::string, AlgorithmConfig> mAlgorithmConfigs;
};

} // namespace AVSAnalyzer 

#endif //ModelConfig_H